<?php
require_once('Arquitectura/AbstractFas.php');
require_once('Clases/Problema.php');
require_once('Clases/Opcion.php');
/*******************************************************
/* Autor : Efrain Gutierrez / Miguel Ortiz
/* Fecha : 11/04/2013
/* Lenguaje: PHP version: 5.4.7
/* Descripción: Clase encargada de las funciones de los Problemas SEM
/********************************************************/

class ExamenAlumno extends Clases\AbstractFas
{
    /*Atributos Globales*/
    private $idExamenAlumno,$matricula,$clave,$calificacion,$listaProblemas;
    
    /********************************************************
    /* _construct()
    /* Proposito: inicializar el objeto.
    /* Parametros : ninguno
    /* Limitaciones: ninguna.
    /* Retorna: ninguna
    /*********************************************************/    
    public function __construct()
    {
        parent::AbstractFas();
    }
   
    /********************************************************
    /* llenarExamenAlumno(string matricula, string clave)
    /* Proposito: inicializar el objeto con ciertos valores.
    /* Parametros : matricula del alumno y clave de examen
    /* Limitaciones: ninguna.
    /* Retorna: ninguna
    /*********************************************************/    
    public function llenarExamenAlumno($matricula,$clave)
    {
        $this->matricula = $matricula;
        $this->clave= $clave;
        $this->calificacion = 0;
        $this->idExamenAlumno = $this->insertarId();
        $problemas = $this->exec("SELECT IdProblema from `examenproblema` where Clave = '".$clave."'");
        while ($row = mysql_fetch_row($problemas)) {
              $this->exec("CALL `InsertarExamenAlumnoProblemas` ('".$this->idExamenAlumno."' , '".$row[0]."' , 0 , '');");
        }
        $this->listaProblemas = array();
    }
    
    /********************************************************
    /* getExamenAlumno()
    /* Proposito: regresar atributo idExamenAlumno.
    /* Parametros : ninguno
    /* Limitaciones: debe de ser diferente de null.
    /* Retorna: el valor de idExamenAlumno.
    /*********************************************************/
    public function getIdExamenAlumno()
    {
        if($this->idExamenAlumno!= null)
            return $this->idExamenAlumno; 
    }
    
    /********************************************************
    /* getMatricula()
    /* Proposito: regresar atributo matricula.
    /* Parametros : ninguno
    /* Limitaciones: debe de ser diferente de null.
    /* Retorna: el valor de matricula
    /*********************************************************/
    public function getMatricula()
    {
        if($this->matricula!= null)
            return $this->matricula; 
    }
   
    /********************************************************
    /* getClave()
    /* Proposito: regresar atributo clave.
    /* Parametros : ninguno
    /* Limitaciones: debe de ser diferente de null.
    /* Retorna: el valor de clave
    /*********************************************************/
    public function getClave()
    {
        if($this->clave!= null)
            return $this->clave; 
    }
    
    /********************************************************
    /* getCalificacion()
    /* Proposito: regresar atributo calificacion.
    /* Parametros : ninguno
    /* Limitaciones: debe de ser diferente de null.
    /* Retorna: el valor de calificacion
    /*********************************************************/
    public function getCalificacion()
    {
        if($this->calificacion!= null)
            return $this->calificacion; 
    }
    
    /********************************************************
    /* getListaProblemas()
    /* Proposito: regresar atributo listaProblemas.
    /* Parametros : ninguno
    /* Limitaciones: debe de ser diferente de null.
    /* Retorna: el valor de listaProblemas
    /*********************************************************/
    public function getListaProblemas()
    {
        if($this->listaProblemas!= null)
            return $this->listaProblemas; 
    }
    
    /********************************************************
    /* esBloqueado(string clave)
    /* Proposito: checar estado de bloqueo un examen.
    /* Parametros : ninguno
    /* Limitaciones: debe de ser diferente de null.
    /* Retorna: Verdadero/Falso
    /*********************************************************/
    public function esBloqueado($clave)
    {
        $lista = array();
        array_push($lista, $clave);
        $valor = $this->execProcedure("esBloqueado", $lista);
        $row = mysql_fetch_row($valor);
        return ($row[0] == "1");
    }
    
    /********************************************************
    /* calificar()
    /* Proposito: calificar el examen del alumno.
    /* Parametros : ninguno
    /* Limitaciones: objeto inicializado previamente.
    /* Retorna: ninguno
    /*********************************************************/
    public function calificar()
    {
        $aciertos = 0;
        foreach($this->listaProblemas as $problema)
        {
            $valor = $this->exec("Select Respuesta from ExamenAlumnoProblemas where IdExamenAlumno = '".$this->idExamenAlumno."' AND IdProblema = '".$problema->getIdProblema()."'");
            $respuesta = mysql_fetch_row($valor);
            $respuesta = $respuesta[0];
            $opciones = $problema->getListaOpciones();
            $count= 0;
            foreach($opciones as $opcion)
            {
                if($opcion->esRespuesta())
                    break;
                $count++;
            }
            if($respuesta == $count)
                $aciertos++;
        }
        $resultado = $aciertos * (100/count($this->listaProblemas));
        $this->setCalificacion($resultado);
        $this->update();
    }
    
    /********************************************************
    /* getExamenes(int materia, int grupo,int parcial)
    /* Proposito: recuperar examenes de un grupo de una materia en cierto parcial.
    /* Parametros : materia, grupo, parcial
    /* Limitaciones: ninguno.
    /* Retorna: Lista de Examenes
    /*********************************************************/
    public function getExamenes($materia,$grupo,$parcial)
    {
        $lista = array();
        $examenes = array();
        array_push($lista, $materia);
        array_push($lista, $grupo);
        array_push($lista, $parcial);
        $valor = $this->execProcedure("getExamenes", $lista);
        while($row = mysql_fetch_row($valor))
            array_push ($examenes, $this->get($row[0]));
        return $examenes;
    }
    
    /********************************************************
    /* setIdExamenAlumno(int IdExamenAlumno)
    /* Proposito: cambiar el valor del atributo idExamenAlumno.
    /* Parametros : idExamenAlumno
    /* Limitaciones: el nuevo valor debe de ser diferente de null.
    /* Retorna: nada
    /*********************************************************/    
    public function setIdExamenAlumno($idExamenAlumno)
    {
        if($idExamenAlumno != null)
            $this->idExamenAlumno= $idExamenAlumno; 
    }
    
    /********************************************************
    /* setMatricula(string matricula)
    /* Proposito: cambiar el valor del atributo matricula.
    /* Parametros : matricula
    /* Limitaciones: el nuevo valor debe de ser diferente de null.
    /* Retorna: nada
    /*********************************************************/    
    public function setMatricula($matricula)
    {
        if($matricula != null)
            $this->matricula= $matricula; 
    }
    
    /********************************************************
    /* setClave(string Clave)
    /* Proposito: cambiar el valor del atributo Clave.
    /* Parametros : Clave
    /* Limitaciones: el nuevo valor debe de ser diferente de null.
    /* Retorna: nada
    /*********************************************************/    
    public function setClave($clave)
    {
        if($clave != null)
            $this->clave= $clave; 
    }
    
    /********************************************************
    /* setCalificacion(double calificacion)
    /* Proposito: cambiar el valor del atributo calificacion.
    /* Parametros : calificacion
    /* Limitaciones: el nuevo valor debe de ser diferente de null.
    /* Retorna: nada
    /*********************************************************/    
    public function setCalificacion($calificacion)
    {
        if($calificacion != null)
            $this->calificacion= $calificacion; 
    }
    
    /********************************************************
    /* setListaProblemas(List listaProblemas)
    /* Proposito: cambiar el valor del atributo listaProblemas.
    /* Parametros : listaProblemas
    /* Limitaciones: el nuevo valor debe de ser diferente de null.
    /* Retorna: nada
    /*********************************************************/    
    public function setlistaProblemas($listaProblemas)
    {
        if($listaProblemas != null)
            $this->listaProblemas= $listaProblemas; 
    }
    
    /********************************************************
    /* comandos()
    /* Proposito: validar la existencia de un Problema en la base de datos.
    /* Parametros : ninguno
    /* Limitaciones: Problema inicializado.
    /* Retorna: Verdadero o Falso
    /*********************************************************/
   
    protected function comandos() {
        $this->id = "IdExamenAlumno";
        $this->tabla = "`ExamenAlumno`";
        $this->strDelete = "DeleteExamenAlumno";
        $this->strInsertar = "InsertarExamenAlumno";
        $this->strUpdate = "UpdateExamenAlumno";
    }
    
    /********************************************************
    /* fillFas(my_sql_row row)
    /* Proposito: inicializar un ExamenALumno con la info de la base de datos.
    /* Parametros : row de consulta
    /* Limitaciones: row completo mysql
    /* Retorna: Ninguna
    /*********************************************************/
    protected function fillFas($row) {
        $row = mysql_fetch_row($row);
        $this->idExamenAlumno = $row[0];
        $this->clave = $row[1];
        $this->matricula = $row[2];
        $this->calificacion = $row[3];
        $this->listaProblemas= array();
        $p = $this->exec("SELECT IdProblema from `ExamenAlumnoProblemas` where IdExamenAlumno = '".$this->idExamenAlumno."'");
        while ($row = mysql_fetch_row($p)) {
            $obj = new Problema();
            $problema = $obj->get($row[0]);
            array_push($this->listaProblemas, $problema);
        }
    }

    /********************************************************
    /* get(int id)
    /* Proposito: inicializar un ExamenALumno a partir de un id desde una base de datos.
    /* Parametros : id del Problema
    /* Limitaciones: Ninguna
    /* Retorna: Problema
    /*********************************************************/
    public function get($id) {
        $abs = $this->getAbstractFas(new ExamenAlumno(),$id,$this->tabla,$this->id);
        return $abs;
    }
    
    /********************************************************
    /* getAll
    /* Proposito: inicializar lista de ExamenAlumno existentes desde una base de datos.
    /* Parametros : Ninguna
    /* Limitaciones: Ninguna
    /* Retorna: Lista de Problemaes
    /*********************************************************/
   
    public function getAll() {
        $abs = $this->getAllAbstract($this->tabla,$this->id,new Problema());
        return $abs;
    }
    
    /********************************************************
    /* getAtributos()
    /* Proposito: regresar arreglo de atributos locales
    /* Parametros : Ninguna
    /* Limitaciones: Ninguna
    /* Retorna: Arreglo
    /*********************************************************/
   
    public function getAtributos() {
        $lst = array();
        array_push($lst,$this->clave);
        array_push($lst,$this->matricula);
        array_push($lst,$this->calificacion);
        array_push($lst,$this->idExamenAlumno);
        return $lst;
    }
} // fin de la clase Problema

?>
